package org.example.com.Utils;

import javassist.*;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
import org.example.com.Controller.UserController;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author cc
 * @date 2021/8/10 10:08
 * @Description 获取方法里参数的名字和参数的类型
 */

public class GetParasmnameAndTypeUtils {
    public static  Map<String,Class<?>> getPartamsName(Class aClass, Method method) throws NotFoundException {

        Map<String,Class<?>>parameters  = new LinkedHashMap<>();

        ClassPool pool = ClassPool.getDefault();
        //从file加载classpath
        pool.insertClassPath(new ClassClassPath(aClass));
        //获取该类的方法 参数第一个是类名，第二个是方法名；
        CtMethod cm = pool.getMethod(aClass.getName(), method.getName());
        //获取这个方法上的描述，以及参数信息
        MethodInfo methodInfo = cm.getMethodInfo();
        //获取方法上参数信息和名字；
        CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
        //获取参数里属性值
        LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
        if (attr != null) {
            int pos = Modifier.isStatic(cm.getModifiers())?0:1;
          for (int i = 0;i<method.getParameterCount();i++){
              String paramname = attr.variableName(i + pos);
              parameters.put(paramname,method.getParameterTypes()[i]);
          }
        }
        return parameters;
    }
}
